package com.esunny.resourcevisualization.service.impl;

import com.esunny.resourcevisualization.domain.entity.EnumGroup;
import com.esunny.resourcevisualization.domain.entity.EnumItem;
import com.esunny.resourcevisualization.domain.request.EnumDto;
import com.esunny.resourcevisualization.domain.response.ReturnStructure;
import com.esunny.resourcevisualization.manage.EnumGroupManage;
import com.esunny.resourcevisualization.manage.EnumItemManage;
import com.esunny.resourcevisualization.manage.EnumManage;
import com.esunny.resourcevisualization.service.EnumService;
import org.jetbrains.annotations.NotNull;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.List;

/**
 * @version 1.0.0.0
 * @ClassName EnumServiceImpl
 * @Description 枚举组、枚举项逻辑处理
 * @Author baochencong
 * @Date 2020/9/26 13:10
 */
@Service
public class EnumServiceImpl implements EnumService {

    @Resource
    private EnumManage enumManage;

    @Resource
    private EnumGroupManage enumGroupManage;

    @Resource
    private EnumItemManage enumItemManage;

    @Override
    public ReturnStructure addEnumData(EnumDto enumDto) {
        String groupName = enumDto.getEnumGroup().getEnumGroupName();
        if (!isExistedEnumGroupByGroupName(groupName)) {
            if (enumGroupExistedByGroupTitle(enumDto.getEnumGroup().getEnumGroupTitle())) {
                return ReturnStructure.ERROR("该枚举组中文名已经存在", null);
            }
            List<EnumItem> enumItemList = enumDto.getEnumItemList();
            for (EnumItem item : enumItemList) {
                item.setEnumGroupName(groupName);
            }
            return enumManage.addEnumData(enumDto);
        }
        return ReturnStructure.ERROR("该枚举组英文名已经存在", null);
    }

    @Override
    public List<EnumItem> addEnumItem(EnumDto enumDto) {
        String groupName = enumDto.getEnumGroup().getEnumGroupName();
        List<EnumItem> enumItemList = enumDto.getEnumItemList();
        for (EnumItem item : enumItemList) {
            item.setEnumGroupName(groupName);
        }
        return enumItemManage.addEnumItem(enumItemList);
    }

    @Override
    public ReturnStructure deleteEnumGroupByGroupName(String groupName) {
        if (isExistedEnumGroupByGroupName(groupName)) {
            return enumManage.deleteEnumData(groupName);
        }
        return ReturnStructure.ERROR("该枚举组不存在", null);
    }

    @Override
    public ReturnStructure deleteEnumItemByItemId(int itemId) {
        if (isExistedEnumItemByItemId(itemId)) {
            return enumItemManage.deleteEnumItemByItemId(itemId);
        }
        return ReturnStructure.ERROR("该枚举项不存在", null);
    }

    @Override
    public ReturnStructure updateEnumGroup(EnumGroup enumGroup) {
        String groupName = enumGroup.getEnumGroupName();
        if (isExistedEnumGroupByGroupName(groupName)) {
            if (updateEnumGroupFailed(enumGroup, groupName)) {
                return ReturnStructure.ERROR("该枚举组中文名已经存在", null);
            }
            return enumGroupManage.updateEnumGroupByGroupName(enumGroup);
        }
        return ReturnStructure.ERROR("该枚举组不存在", null);
    }

    @Override
    public EnumGroup getEnumGroupByGroupName(String groupName) {
        return enumGroupManage.getEnumGroupByGroupName(groupName);
    }

    @Override
    public List<EnumGroup> getEnumGroupList() {
        return enumGroupManage.getEnumGroupList();
    }

    @Override
    public List<EnumItem> getEnumItemByGroupName(String groupName) {
        return enumItemManage.getEnumItemListByGroupName(groupName);
    }

    @Override
    public List<EnumItem> getEnumItemListByGroupId(int groupId) {
        EnumGroup enumGroupByGroupId = enumGroupManage.getEnumGroupByGroupId(groupId);
        return enumItemManage.getEnumItemListByGroupName(enumGroupByGroupId.getEnumGroupName());
    }

    /**
     * 判断是否可以更新枚举组中文名
     *
     * @param enumGroup 待更新数据
     * @param groupName 枚举组英文名
     * @return 是否不可以更新
     */
    private boolean updateEnumGroupFailed(@NotNull EnumGroup enumGroup, String groupName) {
        if (enumGroupManage.getEnumGroupByGroupName(groupName).getEnumGroupTitle().equals(enumGroup.getEnumGroupTitle())) {
            return false;
        } else {
            return enumGroupExistedByGroupTitle(enumGroup.getEnumGroupTitle());
        }
    }

    /**
     * 通过枚举组中文名判断枚举组是否存在
     *
     * @param groupTitle 枚举组中文名
     * @return 枚举组是否存在
     */
    private boolean enumGroupExistedByGroupTitle(String groupTitle) {
        return enumGroupManage.getEnumGroupByGroupTitle(groupTitle) != null;
    }

    /**
     * 通过枚举组名判断该枚举组是否存在
     *
     * @param groupName 枚举组名
     * @return 枚举组是否存在
     */
    private boolean isExistedEnumGroupByGroupName(String groupName) {
        return enumGroupManage.getEnumGroupByGroupName(groupName) != null;
    }

    /**
     * 通过枚举项id判断该枚举项是否存在
     *
     * @param itemId 枚举项id
     * @return 枚举项是否存在
     */
    private boolean isExistedEnumItemByItemId(int itemId) {
        return enumItemManage.getEnumItemByItemId(itemId) != null;
    }
}
